package main

import (
	"fmt"
	"net/http"
)

/*
http.Client类型中的Transport字段代表着什么？

	http.Client类型中的Transport字段代表着：向网络服务发送 HTTP 请求，并从网络服务接收 HTTP 响应的操作过程。

	这个字段是http.RoundTripper接口类型的，它有一个由http.DefaultTransport变量代表的缺省值（以下简称DefaultTransport）。
在初始化一个http.Client类型的值（以下简称Client值）的时候，如果没有显式地为该字段赋值，那么这个Client值就会直接使用DefaultTransport。

	DefaultTransport的实际类型是*http.Transport，后者即为http.RoundTripper接口的默认实现。

	http.Transport类型，会在内部使用一个net.Dialer类型的值（以下简称Dialer值），并且，它会把该值的Timeout字段的值，设定为30秒。

	http.Transport类型还包含了很多其他的字段，其中有一些字段是关于操作超时的。

		1.IdleConnTimeout：含义是空闲的连接在多久之后就应该被关闭。
		2.DefaultTransport会把该字段的值设定为90秒。如果该值为0，那么就表示不关闭空闲的连接。注意，这样很可能会造成资源的泄露。
		3.ResponseHeaderTimeout：含义是，从客户端把请求完全递交给操作系统到从操作系统那里接收到响应报文头的最大时长。DefaultTransport并没有设定该字段的值。
		4.ExpectContinueTimeout：含义是，在客户端递交了请求报文头之后，等待接收第一个响应报文头的最长时间。
		5.TLSHandshakeTimeout：TLS 是 Transport Layer Security 的缩写，可以被翻译为传输层安全。
这个字段代表了基于 TLS 协议的连接在被建立时的握手阶段的超时时间。若该值为0，则表示对这个时间不设限。DefaultTransport把该字段的值设定为了10秒。

	MaxIdleConns:
		无论当前的http.Transport类型的值（以下简称Transport值）访问了多少个网络服务，MaxIdleConns字段都只会对空闲连接的总数做出限定。

	MaxIdleConnsPerHost:
		MaxIdleConnsPerHost字段限定的则是，该Transport值访问的每一个网络服务的最大空闲连接数。MaxIdleConnsPerHost字段的缺省值，
	由http.DefaultMaxIdleConnsPerHost变量代表，值为2。也就是说，在默认情况下，对于某一个Transport值访问的每一个网络服务，它的空闲连接数都最多只能有两个。

	MaxIdleConnsPerHost:
		针对某一个Transport值访问的每一个网络服务的最大连接数，不论这些连接是否是空闲的。并且，该字段没有相应的缺省值，它的零值表示不对此设限。

问题：http.Server类型的ListenAndServe方法都做了哪些事情？
	http.Server类型与http.Client是相对应的。http.Server代表的是基于 HTTP 协议的服务端，或者说网络服务。
	http.Server类型的ListenAndServe方法的功能是：监听一个基于 TCP 协议的网络地址，并对接收到的 HTTP 请求进行处理。这个方法会默认开启针对网络连接的存活探测机制，以保证连接是持久的。
同时，该方法会一直执行，直到有严重的错误发生或者被外界关掉。当被外界关掉时，它会返回一个由http.ErrServerClosed变量代表的错误值

	ListenAndServe方法主要会做下面这几件事情?
		1.检查当前的http.Server类型的值（以下简称当前值）的Addr字段。该字段的值代表了当前的网络服务需要使用的网络地址，即：IP 地址和端口号. 如果这个字段的值为空字符串，那么就用":http"代替。
也就是说，使用任何可以代表本机的域名和 IP 地址，并且端口号为80。
		2.通过调用net.Listen函数在已确定的网络地址上启动基于 TCP 协议的监听。
		3.检查net.Listen函数返回的错误值。如果该错误值不为nil，那么就直接返回该值。否则，通过调用当前值的Serve方法准备接受和处理将要到来的 HTTP 请求。

*/

func main() {

	url :="http://google.cn"
	fmt.Printf("Send request to %q with method GET ...\n", url)
	/*
		http.Get函数会返回两个结果值。
		第一个结果值的类型是*http.Response
		第二个结果值是error类型的，它代表了在创建和发送 HTTP 请求，以及接收和解析 HTTP 响应的过程中可能发生的错误。
	 */
	resp, err := http.Get(url)

	if err != nil {
		fmt.Printf("request sending error: %v\n", err)
	}

	defer resp.Body.Close()

	line := resp.Proto + " " +resp.Status
	fmt.Printf("The first line of response:\n%s\n", line)

}
